#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>

using namespace std;
using LL = long long;
const int N = 2e5 + 10;
/*
题意:给定一个树,你需要把qu暗中1~n的一个排列赋给n个节点。然后每次操作可以选择一个叶子节点删掉并获得叶子节点的权值并将这个权值加入序列末尾(初始时为空)。每次删除叶子的时，如果父节的权值比它小，则父节点的权值就会变成这个叶子的权值.

操作一直进行到不能进行操作。最终我们会获得一个权重序列。这个序列的最长非降子序列长度就是得分. 构造树上的权值，最大化这个得分。

题解:

最优时,我们可以让每个节点权重都比儿子大,不然的话,可以让它和权重最大的儿子换,答案不会变差. 因此下面讨论都是假设父亲比儿子大

不同子树的最长非降序列总是可以合并在一起,因为它们之间的删除顺序不会互相干扰,因此我们能单独求每个子树的最长非降序列.

将子树的最长非降序列合并为一个有两种方式:

以子树的根为结尾,即子树中最小的值作为结尾.此时只能选择包含最小值的那颗子树的最长非降序列,并且子树也必须选根. 实际上就是选择这个节点到最小的叶子的一条链,也就是这个值等于子树高度

不以子树的根作为结尾. 此时,可以将各个儿子的最长序列都合并起来.

我们用dp[u][0/1]表示每个节点是否处于最长非降序列的上述两种状态取得的最长非降序列长度,递归求解即可.

或者用f[u]表示以u为根的子树的最长非降序列长度. 然后dfs返回树高

*/
int n;
int f[N][2]; 
int h[N], e[N], ne[N], idx;
bool st[N];

void add(int a, int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}

void dfs(int u){
    st[u] = true;
    int res = 0;
    f[u][0] = f[u][1] = 0;
    for(int i = h[u]; ~i; i = ne[i]){
        int j = e[i];
        if(!st[j]) dfs(j);
        f[u][0] += max(f[j][0], f[j][1]);
        res = max(res, f[j][1]);
    }

    f[u][1] = res + 1;
}

int main(){
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    memset(h, -1, sizeof h);

    cin >> n;
    for(int i = 2, x; i <= n; i ++){
        cin >> x;
        add(x, i);
    }

    dfs(1);

    cout << max(f[1][0], f[1][1]) << '\n';


    return 0;
}